package com.cc.wechat.controller;

import com.cc.wechat.common.ApiResponse;
import com.cc.wechat.common.constants.MessageConstants;
import com.cc.wechat.dto.request.LoginRequest;
import com.cc.wechat.dto.request.RegisterRequest;
import com.cc.wechat.dto.response.JwtAuthResponse;
import com.cc.wechat.dto.response.RegisterResponse;
import com.cc.wechat.service.UserService;
import com.cc.wechat.service.TokenBlacklistService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 认证控制器
 * 处理用户认证相关的请求，包括登录和注册
 */
@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthController {

    /**
     * 用户服务，处理用户相关的业务逻辑
     */
    private final UserService userService;

    /**
     * 用户服务，处理用户相关的业务逻辑
     */
    private final TokenBlacklistService tokenBlacklistService;

    /**
     * 用户登录接口
     * 验证用户凭据并返回JWT令牌
     * @param loginRequest 登录请求，包含用户名和密码
     * @return 包含JWT令牌和用户信息的响应
     */
    @PostMapping("/login")
    public ApiResponse<JwtAuthResponse> login(@Valid @RequestBody LoginRequest loginRequest) {
        return ApiResponse.success(MessageConstants.Auth.LOGIN_SUCCESS, userService.login(loginRequest));
    }

    /**
     * 用户注册接口
     * 创建新用户并返回JWT令牌
     * @param registerRequest 注册请求，包含用户注册信息
     * @return 包含JWT令牌和用户信息的响应
     */
    @PostMapping("/register")
    public ApiResponse<RegisterResponse> register(@Valid @RequestBody RegisterRequest registerRequest) {
        return ApiResponse.success(MessageConstants.Auth.REGISTER_SUCCESS, userService.register(registerRequest));
    }

    /**
     * 用户登出接口
     * 使当前JWT令牌失效，将其加入黑名单
     * @param request HTTP请求，用于获取Authorization头中的JWT令牌
     * @return 登出成功的响应
     */
    @PostMapping("/logout")
    public ApiResponse<JwtAuthResponse> logout(HttpServletRequest request) {
        // 从请求头获取token
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            // 将token加入黑名单
            tokenBlacklistService.addToBlacklist(token);
        }
        
        return ApiResponse.success(MessageConstants.Auth.LOGOUT_SUCCESS, null);
    }
} 